package cn.dazhou.networkdemo

import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.telephony.SubscriptionManager
import android.text.format.DateFormat
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.telephony.SubscriptionManagerCompat
import cn.dazhou.networkdemo.databinding.ActivityGetSimSlotIndexMainBinding

class GetSimSlotIndexMainActivity : AppCompatActivity() {

    private val binding by lazy { ActivityGetSimSlotIndexMainBinding.inflate(layoutInflater) }
    private var mListener: SubscriptionManager.OnSubscriptionsChangedListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        binding.getSubscriptionIds.setOnClickListener { getSubscriptionIds() }
        binding.getSlotIndex.setOnClickListener { showSlotIndex(NetworkUtil.getSlotIndex()) }
        binding.getDefaultSlotIndex.setOnClickListener { showSlotIndex(NetworkUtil.getDefaultSimSlotIndex()) }
        binding.getDefaultVoiceSlotIndex.setOnClickListener { showSlotIndex(NetworkUtil.getDefaultVoiceSimSlotIndex()) }
        binding.getDefaultSmsSlotIndex.setOnClickListener { showSlotIndex(NetworkUtil.getDefaultSmsSimSlotIndex()) }
        binding.getDefaultDataSlotIndex.setOnClickListener { showSlotIndex(NetworkUtil.getDefaultDataSimSlotIndex()) }
        binding.addListener.setOnClickListener { addListener() }
        binding.removeListener.setOnClickListener {
            mListener?.let { SubscriptionManager.from(this).removeOnSubscriptionsChangedListener(it) }
            mListener = null
        }
        binding.getSlotIndexes.setOnClickListener { getSlotIndexes() }
    }

    private fun getSlotIndexes() {
        val sb = StringBuilder()
        sb.append("${DateFormat.format("HH:mm:ss", System.currentTimeMillis())} 卡槽索引如下（0为卡1，1为卡2）：")
        val defaultSubscriptionId = SubscriptionManager.getDefaultSubscriptionId()
        sb.append("\ndefaultSubscriptionId = ${SubscriptionManagerCompat.getSlotIndex(defaultSubscriptionId)}")
        val defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId() // 系统设置中的那个默认数据卡的subscriptionId，可由用户修改
        sb.append("\ndefaultDataSubscriptionId = ${SubscriptionManagerCompat.getSlotIndex(defaultDataSubscriptionId)}")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // R 为Android11
            // 当前正在使用的活动数据订阅的subscriptionId
            // 即便用户设置了默认数据卡（DefaultDataSubscriptionId），但如果由于网络状态、硬件问题等原因该卡未激活，系统可能会切换到另一个订阅。
            // 如果当前没有活动的订阅用于数据流量（例如数据连接被禁用或没有信号），它可能返回 SubscriptionManager.INVALID_SUBSCRIPTION_ID。
            // 例如：用户设置 SIM 卡 1 为默认数据卡，但由于 SIM 卡 1 暂时没有信号，系统会切换到 SIM 卡 2，这时 ActiveDataSubscriptionId 就指向 SIM 卡 2，
            // 而 DefaultDataSubscriptionId 仍然是 SIM 卡 1。
            val activeDataSubscriptionId = SubscriptionManager.getActiveDataSubscriptionId()
            sb.append("\nactiveDataSubscriptionId = ${SubscriptionManagerCompat.getSlotIndex(activeDataSubscriptionId)}")
        }
        val defaultVoiceSubscriptionId = SubscriptionManager.getDefaultVoiceSubscriptionId()
        sb.append("\ndefaultVoiceSubscriptionId = ${SubscriptionManagerCompat.getSlotIndex(defaultVoiceSubscriptionId)}")
        val defaultSmsSubscriptionId = SubscriptionManager.getDefaultSmsSubscriptionId()
        sb.append("\ndefaultSmsSubscriptionId = ${SubscriptionManagerCompat.getSlotIndex(defaultSmsSubscriptionId)}")
        binding.textView.text = sb.toString()
    }

    private fun addListener() {
        if (mListener != null) {
            return
        }

        val listener = object : SubscriptionManager.OnSubscriptionsChangedListener() {
            override fun onSubscriptionsChanged() {
                super.onSubscriptionsChanged()
                getSubscriptionIds()
            }
        }.also { mListener = it }

        // 这是粘性监听器，一注册就能立马收到一次监听回调（即使当前订阅没有发生变化）
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            SubscriptionManager.from(this).addOnSubscriptionsChangedListener(ContextCompat.getMainExecutor(this), listener)
        } else {
            SubscriptionManager.from(this).addOnSubscriptionsChangedListener(listener)
        }
    }

    private fun getSubscriptionIds() {
        val sb = StringBuilder()
        sb.append("${DateFormat.format("HH:mm:ss", System.currentTimeMillis())} 订阅ID如下：")
        val defaultSubscriptionId = SubscriptionManager.getDefaultSubscriptionId()
        sb.append("\ndefaultSubscriptionId = $defaultSubscriptionId")
        val defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId()
        sb.append("\ndefaultDataSubscriptionId = $defaultDataSubscriptionId")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 当前正在使用的活动数据订阅的subscriptionId
            // 即便用户设置了默认数据卡（DefaultDataSubscriptionId），但如果由于网络状态、硬件问题等原因该卡未激活，系统可能会切换到另一个订阅。
            // 如果当前没有活动的订阅用于数据流量（例如数据连接被禁用或没有信号），它可能返回 SubscriptionManager.INVALID_SUBSCRIPTION_ID。
            // 例如：用户设置 SIM 卡 1 为默认数据卡，但由于 SIM 卡 1 暂时没有信号，系统会切换到 SIM 卡 2，这时 ActiveDataSubscriptionId 就指向 SIM 卡 2，
            // 而 DefaultDataSubscriptionId 仍然是 SIM 卡 1。
            val activeDataSubscriptionId = SubscriptionManager.getActiveDataSubscriptionId()
            sb.append("\nactiveDataSubscriptionId = $activeDataSubscriptionId")
        }
        val defaultVoiceSubscriptionId = SubscriptionManager.getDefaultVoiceSubscriptionId()
        sb.append("\ndefaultVoiceSubscriptionId = $defaultVoiceSubscriptionId")
        val defaultSmsSubscriptionId = SubscriptionManager.getDefaultSmsSubscriptionId()
        sb.append("\ndefaultSmsSubscriptionId = $defaultSmsSubscriptionId")
        binding.textView.text = sb.toString()
    }

    @SuppressLint("SetTextI18n")
    private fun showSlotIndex(slotIndex: Int) {
        when (slotIndex) {
            SubscriptionManager.INVALID_SIM_SLOT_INDEX -> binding.textView.text = "无效slotIndex"
            -2 -> binding.textView.text = "无效订阅ID"
            else -> binding.textView.text = "slotIndex = $slotIndex（0为卡1，1为卡2）"
        }
    }
}